package com.songtech.base.universal.dao.api;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import com.songtech.base.universal.dao.api.beans.TableBeans;
import com.songtech.base.universal.dao.beans.Where;

public interface Mapper<T extends Object, PK extends Serializable> {
	/**
	 * 添加不为空的记录（只将不为空字段入库，效率高）
	 * @param obj
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int insert(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 多条数据同时插入
	 * @param objs
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int insert(List<T> objs, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 添加不为空的记录(主键使用系统生成的UUID)
	 * @param obj
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int insertSetUUID(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 多条数据同时插入(主键使用系统生成的UUID)
	 * @param objs
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int insertSetUUID(List<T> objs, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 删除某个记录
	 * @param id 主键
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int delete(PK id, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件删除记录
	 * @param obj 条件对象
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int delete(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件删除记录
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int delete(Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 更新不为null的字段
	 * <br>根据主键进行更新
	 * @param obj
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int updateNotEmpty(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 更新所有字段
	 * <br>根据主键进行更新
	 * @param obj
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int update(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件更新不为null的字段
	 * @param obj
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int updateNotEmpty(T obj, T where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件更新所有字段
	 * @param obj
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int update(T obj, T where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件更新不为null的字段
	 * @param obj
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int updateNotEmpty(T obj, Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件更新所有字段
	 * @param obj
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	int update(T obj, Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 通过主键获取某个记录
	 * @param id 主键
	 * @param tableBeans
	 * @return Object
	 * @throws SQLException 
	 */
	T selectById(Serializable id, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 通过主键获取某个字段的值
	 * @param id
	 * @param fileName
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	Object selectFieldById(PK id, String fileName, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件查询列表
	 * @param obj 查询的实体类
	 * @param tableBeans
	 * @throws SQLException 
	 */
	List<T> selectList(Object obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 条件查询列表
	 * @param where 条件表达式
	 * @param tableBeans
	 * @throws SQLException 
	 */
	List<T> selectList(Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 查询某个字段列表
	 * @param where 条件
	 * @param fileName 要查询的字段
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	List<Serializable> selectListFile(Where where, String fileName, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 自定义sql查询
	 * @param sql 用于执行查询的Sql
	 * @return 结果集合
	 * @throws SQLException 
	 */
	List<Map<String, Object>> listBySql(String sql) throws SQLException;
	
	/**
	 * 执行自定义sql
	 * @param sql 用于执行的Sql
	 * @param args Sql占位付对应的参数
	 * @return
	 * @throws SQLException 
	 */
	int excuse(String sql) throws SQLException;
	
	/**
	 * 获取指定条件的记录数
	 * @param where 条件
	 * @param tableBeans
	 * @return 查询到的记录数
	 * @throws SQLException 
	 */
	long count(Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 是否存在字段相同的记录（ID以及不为空的字段除外）
	 * @param obj 参照实体
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	boolean isExist(T obj, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 是否存在指定条件的记录
	 * @param where 条件
	 * @param tableBeans
	 * @return
	 * @throws SQLException 
	 */
	boolean isExist(Where where, TableBeans tableBeans) throws SQLException;
	
	/**
	 * 获得下一个序列的值
	 * @return
	 */
	long nextId();
}
